#pragma once

#include "Protocol.hpp"
#include "Logger.hpp"
#include <iostream>
#include <string>
#include <functional>

using handler_t = std::function<Response (Request &req)>;
// 只负责对报文进行各种解析工作
// 对解析出来的请求和应答，Parser应该归你处理吗？？
class Parser
{
public:
    Parser(handler_t handler):_handler(handler)
    {}
    std::string Parse(std::string &inbuffer)
    {
        LOG(LogLevel::DEBUG) << "inbuffer: \r\n" << inbuffer;
        std::string send_str;
         std::cout<<"dasdsadasdasd"<<std::endl;
        while (true)
        {
            std::string jsonstr;
            // 1. 解析报文
            int n = Protocol::Unpack(inbuffer, &jsonstr);
            if (n < 0)
                break;
            else if (n == 0)
                break; // 我已经将inbuffer所有完整报文处理完毕
            else
            {
                LOG(LogLevel::DEBUG) << "jsonstr: \r\n" << jsonstr;
                Request req;
                // 2. 反序列化
                if (!req.Deserialize(jsonstr))
                {
                    return std::string();
                }
                // 3. 根据req->response, 具体的业务
                Response resp = _handler(req);

                // 4. 对resp在进行序列化
                std::string resp_json;
                if (!resp.Serialize(&resp_json))
                {
                    return std::string();
                }

                // 5. 打包
                send_str += Protocol::Package(resp_json);
            }
        }
        return send_str;
    }
    ~Parser() {}
private:
    handler_t _handler;
};
//这个函数做的主要是我们已经读取完了一个数据，然后我们对他进行解包，然后再进行反序列化，然后交给上层应用处理，然后序列化，最后返回的过程